package com.zhoug.common3.json;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author HK-LJJ
 * @Date 2019/11/27
 * @Description see {@link GsonUtils}
 */
public class JsonUtils {


    /**
     * 序列化”=”转化成”\u003d”的问题
     *
     * @param obj
     * @return
     */
    @Deprecated
    public static String toJsonDisableHtmlEscaping(Object obj) {
        return toJson(obj);
    }

    public static String toJsonWithoutExpose(Object obj) {
        return new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(obj);
    }

    /**
     * 序列化为字符串
     *
     * @param obj
     * @return
     */
    public static String toJson(Object obj) {
        return GsonUtils.getDefault().toJson(obj);
    }

    /**
     * json字符串反序列化为对象
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public static <T> T fromJson(String json, Class<T> cls) {
        return GsonUtils.getDefault().fromJson(json, cls);
    }

    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param typeToken
     * @param <T>
     * @return
     */

    public static <T> List<T> fromJsonList(String json, TypeToken<List<T>> typeToken) {
        return GsonUtils.getDefault().fromJsonList(json, typeToken);
    }

    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param typeToken
     * @param <T>
     * @return
     */
    public static <T> ArrayList<T> fromJsonArrayList(String json, TypeToken<ArrayList<T>> typeToken) {
        return GsonUtils.getDefault().fromJsonArrayList(json, typeToken);
    }


    /**
     * 用来判断json为null
     *
     * @param jsonElement
     * @return
     */
    public static boolean isNonNull(JsonElement jsonElement) {
        return jsonElement != null && !jsonElement.isJsonNull();
    }

    /**
     * 复制
     *
     * @param src
     * @param <T>
     * @return
     * @noinspection unchecked
     */
    public static <T> T copy(T src) {
        return GsonUtils.getDefault().copy(src);
    }
    /**
     * 复制
     *
     * @param src
     * @param <T>
     * @return
     * @noinspection unchecked
     */
    public <T> List<T> copyList(List<T> src, TypeToken<List<T>> typeToken) {
        return GsonUtils.getDefault().copyList(src,typeToken);
    }

    /**
     * 复制
     * @param src
     * @param <T>
     * @return
     * @noinspection unchecked
     */
    public <T> ArrayList<T> copyArrayList(List<T> src, TypeToken<ArrayList<T>> typeToken) {
        return GsonUtils.getDefault().copyArrayList(src,typeToken);
    }

}
